package com.lw.function;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Administrator
 * @version 1.0
 * @description:
 * @date 2022/4/26 21:13
 */
public class TestStream {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wamgwu");
        list.add("zhaoliu");
        //转换，就是通过调用数据的某些操作转换成另一个格式的数据，被操作的数据本身没有发生变化
        List<Integer> integerList = list.stream().map(s -> s.length()).collect(Collectors.toList());
        List<String> stringList = list.stream().map(s -> s.trim()).collect(Collectors.toList());
        System.err.println(integerList);
        System.err.println(stringList);

        String[] strings = {"asd", "fdfsa", "asdad", "dsasa"};
//        List<String> stringList1= Arrays.asList(strings);
//        stringList1.add("sdasa");

        long start = System.currentTimeMillis();
        Arrays.stream(strings)
                //.sequential()//串行流(有序的),默认的流就是串行的，如果同时开启了并行流，则谁在后面有效，不可以同时存在
                .parallel()//并行流，多个线程同时执行
                //.forEach()
                .forEachOrdered(s->{//即使是并行的，也会被改成串行的
                    System.err.println(s);
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
        long end = System.currentTimeMillis();
        System.err.println(end-start);

        List<String> collect = Arrays.stream(strings).parallel()
                .peek(System.out::println)//和forEach是一样的，都是遍历数据，单不一样的是forEach是终止符，peek是中间符
                .filter(s -> s.length() > 4)//过滤，需要传递一个断言过去，符合断言的结果会被保存到新的stream
                .limit(1)//限流，有些操作可能是无限的，需要一个limit帮我们结束，或者是有限的里面再次只要一部分数据
                .collect(Collectors.toList());
        System.err.println(collect);
    }
}
